<?php
	// Lớp Fx_Data_Column chuyên dùng để hỗ trợ cho Fx_Data_Row
	class Fx_Data_Column extends Fx_Data_View 
	{
		// Hàng chứa cột
		protected $_dataRow = null;
		// Tiêu đề cột
		protected $_heading = '';
		// Colspan
		protected $_colspan = 1;
		// Rowspan
		protected $_rowspan = 1;
		// Bộ định dạng hiển thị cột
		protected $_renderer = null;
		// Xác định trường dữ liệu trong câu truy vấn bất kỳ
		protected $_field = '';
		// Xác định cột có phải là khóa chính hay không
		protected $_isPrimaryKey = false;
		// Xác định có cho phép sắp xếp hay không
		protected $_sortable = true;
		// Xác định có cho phép lọc hay không
		protected $_filterable = true;
		// Bộ filter
		protected $_filter = null;
		// Đối với dữ liệu dạng select, giá trị của mỗi option có thể
		// khác với nhãn của option đó
		protected $_valueMember = '';
		// Nhãn của option được lấy theo trường nào
		protected $_displayMember = '';
		// Đối với một số column đặc biệt, value chỉ là dạng id được tham chiếu
		
		function __construct($_data = array('id'=>'', 'class'=>'', 'tooltip'=>'', 'heading'=>'', 'renderer'=>null, 'data'=>null, 'field'=>'')) 
		{
			$this->__beforeInit();
			$this->__init($_data);
			$this->__afterInit();
		}
		
		// Khởi tạo các tham số cần thiết
		protected function __init($_data) 
		{
			if (!is_array($_data) || count($_data) == 0) 
			{
				return $this;	
			}
			if (isset($_data['id']))
			{
				$this->setId($_data['id']);	
			}
			if (isset($_data['class']))
			{
				$this->setClassName($_data['class']);	
			}
			if (isset($_data['tooltip']))
			{
				$this->setTooltip($_data['tooltip']);	
			}
			if (isset($_data['heading']))
			{
				$this->setHeading($_data['heading']);	
			}
			if (isset($_data['renderer']))
			{
				$this->setRenderer($_data['renderer']);	
			}
			if (isset($_data['data']))
			{
				$this->setData($_data['data']);	
			}
			if (isset($_data['field']))
			{
				$this->setField($_data['field']);	
			}
			if (isset($_data['colspan']))
			{
				$this->setColspan($_data['colspan']);	
			}
			if (isset($_data['rowspan']))
			{
				$this->setRowspan($_data['rowspan']);	
			}
			if (isset($_data['primarykey']))
			{
				$this->setPrimaryKey($_data['primarykey']);	
			}
			if (isset($_data['sortable']))
			{
				$this->allowSortable($_data['sortable']);	
			}
			if (isset($_data['filterable']))
			{
				$this->allowFilterable($_data['filterable']);	
			}
			return $this;
		}

		protected function __afterInit()
		{
			if ($this->_renderer === null) 
			{
				$this->_renderer = new Fx_Data_Column_Renderer('text', $this);
			}
			if ($this->_filterable === true) 
			{
				$this->_filter = new Fx_Data_Column_Filter('text', $this);
			}
			return $this;	
		}
		
		// Xác định cột có phải là khóa chính hay không
		public function setPrimaryKey($yes = true)
		{
			$this->_isPrimaryKey = $yes;
			$gridView = & $this->getDataRow()->getDataGrid();
			foreach ($gridView->getRowCollection() as $row)
			{
				$column = & $row->getColumn($this->getId());
				$column->_isPrimaryKey = $yes;
			}
			return $this;
		}
		
		public function isPrimaryKey()
		{
			return (boolean)$this->_isPrimaryKey;	
		}
		
		// Có cho phép được sắp xếp hay không
		public function allowSortable($sortable = true)
		{
			$this->_sortable = (boolean)$sortable;	
			return $this;
		}
		
		// Xác định cột có được sắp xếp hay không
		public function isSortable()
		{
			return (boolean)$this->_sortable;	
		}
		
		// Có cho phép được lọc hay không
		public function allowFilterable($filterable = true)
		{
			$this->_filterable = (boolean)$filterable;
			if ($this->_filter !== null)
			{
				$this->_filter->setVisible($filterable);
			}
			return $this;
		}
		
		// Xác định cột có được lọc hay không
		public function isFilterable()
		{
			return (boolean)$this->_filterable;	
		}
		
		// Lấy về bộ filter
		public function & getFilter()
		{
			$filter = & $this->_filter;
			if ($filter === null)
			{
				require_once APP_LIBRARY_PATH . 'doc/fx_data_column_filter.php';
				$filter = new Fx_Data_Column_Filter('text', $this);	
			}
			return $filter;
		}
		
				// Thiết lập value member
		function setValueMember($field)
		{
			if (!is_string($field) || empty($field))
			{
				return false;	
			}
			$this->_valueMember = $field;
			return $this;
		}
		
		// Lấy về value member
		function getValueMember()
		{
			return (string)$this->_valueMember;	
		}
		
		// Thiết lập trường hiển thị
		function setDisplayMember($field)
		{
			if (!is_string($field) || empty($field))
			{
				return false;	
			}
			$this->_displayMember = $field;
			return $this;
		}
		
		// Lấy về trường hiển thị
		function getDisplayMember()
		{
			return (string)$this->_displayMember;	
		}
		
		// Thiết lập bộ filter
		public function setFilter(Fx_Data_Column_Filter $filter)
		{
			$this->_filter = & $filter;
			return $this;
		}
		
		// Thiết lập data row chứa cột
		public function setDataRow(Fx_Data_Row $row)
		{
			if ($row != null)
			{
				$this->_dataRow = & $row;
				$this->_model = & $this->_dataRow->getModel();
			}
			return $this;
		}
		
		// Lấy về data row của cột đó
		public function & getDataRow()
		{
			$row = & $this->_dataRow;
			return $row;
		}
		
		// Thiết lập ID
		public function setId($_id = '')
		{
			if (is_string($_id) && !empty($_id)) 
			{
				$this->_id = $_id;	
			} else {
				$this->_id = $this->_field.'_'.sha1(time());	
			}
			return $this;
		}
		
		// Thiết lập Colspan
		public function setColspan($cols = 1)
		{
			if (is_int($cols) && $cols > 0) 
			{
				$this->_colspan = $cols;	
			}
			return $this;
		}
		
		// Lấy về Colspan
		public function getColspan()
		{
			return (int)$this->_colspan;
		}
		
		// Thiết lập Rowspan
		public function setRowspan($rows = 1)
		{
			if (is_int($rows) && $rows > 0) 
			{
				$this->_rowspan = $rows;	
			}
			return $this;
		}
		
		// Lấy về Rowspan
		public function getRowspan()
		{
			return (int)$this->_rowspan;
		}

		// Thiết lập renderer
		public function setRenderer(&$_renderer = null)
		{
			if ($_renderer != null) 
			{
				$_renderer->setColumn($this);
				$this->_renderer = & $_renderer;	
			}
			return $this;
		}
		
		// Lấy về kiểu render
		public function getRenderer($type = 'text')
		{
			if (null === $this->_renderer) {
				$this->setRenderer(new Fx_Data_Column_Renderer($type));	
			}
			return $this->_renderer;	
		}
		
		// Thiết lập render cho cả cột
		public function setRenderType($type = 'text')
		{
			$this->_renderer->setType($type);
			$gridView = & $this->getDataRow()->getDataGrid();
			foreach ($gridView->getRowCollection() as $row)
			{
				$column = & $row->getColumn($this->getId());
				$column->_renderer->setType($type);
			}
			return $this;	
		}
		
		// Thiết lập cột dữ liệu
		public function setField($_field = '')
		{
			if (is_string($_field) && !empty($_field)) 
			{
				$this->_field = $_field;	
			}
			return $this;
		}
		
		// Lấy về tên cột dữ liệu
		public function getField()
		{
			return (string)$this->_field;	
		}
		
		// Thay đổi dữ liệu field hiện thời thành dữ liệu field
		// khác trong cùng model
		public function changeFieldData($field)
		{
			if ($this->_model === null || !$this->_model->isLoaded())	
			{
				throw new Exception('Cannot change field '.$this->_field . ' to field ' . $field);
			}
			$this->drawDataFromModel($this->_model, $field);
			return $this;
		}
		
		// Thiết lập sự hiển thị của column
		public function setVisible($visible = true)
		{
			$this->_visible = $visible;
			$gridView = & $this->getDataRow()->getDataGrid();
			foreach ($gridView->getRowCollection() as $row)
			{
				$column = & $row->getColumn($this->getId());
				$column->_visible = $visible;
			}
			return $this;
		}
		
		// Lấy về nội dung như một cột của header
		public function getOutputHeader()
		{
			if ($this->isVisible()) {
				$gridView  = $this->getDataRow()->getDataGrid();
				$gridId    = $gridView->getId();
				$actionUrl = base_url() . $gridView->getSortUrl() . '/';
				if (empty($gridId) || empty($actionUrl))
				{
					throw new Exception('DataGridView Id Has Not Set Or Sort Action Url Has Not Set');	
				}
				$output = "<th id=\"colHeaderId_$this->_id\" class=\"columnHeader";
				if ($this->_sortable)
				{
					$output .= " sortable ";	
					$output .= $this->getClassName();	
					$output .= "\" onclick=\"sortBy('$gridId', this.id, '$actionUrl')\"";	
				}
				$output .= " title=\"$this->_tooltip\" alt=\"$this->_tooltip\" colspan=\"$this->_colspan\" rowspan=\"$this->_rowspan\" width=\"$this->_width\" height=\"$this->_height\" onmouseover=\"jQuery(this).toggleClass('hoverTitle');\" onmouseout=\"jQuery(this).toggleClass('hoverTitle');\">";
				$output .= "<div>\n";
				$output .= "<span>" . $this->getHeading() . "</span>\n";
				$output .= "</div>";
				$output .= "</th>";
				return $output;
			}
			return null;	
		}
		
		// Lấy về nội dung html
		public function getOutputHtml()
		{
			if ($this->isVisible())
			{
				$output = "<td id=\"colId_$this->_id\" class=\"cellDataView\" title=\"$this->_tooltip\" alt=\"$this->_tooltip\" colspan=\"$this->_colspan\" rowspan=\"$this->_rowspan\" width=\"$this->_width\" height=\"$this->_height\"";
				if (!$this->_isPrimaryKey) {
					$url = $this->getDataRow()->getRowUrl();
					$output .= " onclick=\"loadAjaxPage('".$url."', null, 'wrapper')\"";	
				}
				$output .= ">";
				$output .= $this->_renderer->renderOutputData();
				$output .= '</td>';
				return $output;
			}
			return null;
		}
		
		// Lấy dữ liệu từ một model
		public function drawDataFromModel(st_model $_model, $_field, $_type = 'text')
		{
			$this->setHeading($_field);
			$this->setClassName($_field);
			$this->setTooltip($_field);
			$this->setField($_field);
			if ($this->_filter != null)
			{
				$this->_filter->setField($_field);
			}
			$this->_renderer->setType($_type);
			$this->setId($_field);
			$_method = 'get' . ucfirst($_field);
			$this->setData($_model->$_method());
			$this->setModel($_model);
			$this->getFilter()->setColumn($this);
			return $this;
		}
	}
	
?>